2016-05-31 5 views
0

Liebe StackOverflow-Community, könnte ich um Hilfe bitten?Wie Sie eine neue Aktivität öffnen und zu einer bestimmten untergeordneten Ansicht blättern?

Ich bin ein Amateur Codierer, der versucht, eine App-Version eines Referenzdokuments zu entwickeln, und es muss durchsuchbar sein. Ich kann die Suchergebnisse nicht mit der Dokumentaktivität verknüpfen und zum Zieltext scrollen.

Ich habe eine MainActivity, die das Dokument in einem scrollview innerhalb eines Koordinatorlayouts anzeigt, also kann ich den beweglichen Aktionsknopf verwenden. Im oberen Bereich des content_main-Layouts habe ich Schaltflächen erstellt, die mit smoothScrollTo zu bestimmten untergeordneten Ansichten (Abschnittsüberschriften) der scrollview blättern. Sie funktionieren gut.

Das Dokument muss jedoch durchsuchbar sein. Ich habe eine ArrayList erstellt, die Suchergebnisse in einer Listenansicht (aus einem Beispiel in www.androidhive.com) in einer Aktivität namens SearchActivity bereitstellt. Ich versuche herauszufinden, wie Klicks auf Listenansicht-Suchergebnisse verwendet werden können, um das content_main-Layout zu öffnen und zu einer bestimmten untergeordneten Ansicht zu scrollen. Ich habe versucht, die Ansätze in SO vorgeschlagen (Click on a TextView opens new activity and jumps to a specific id; Android New Intent start particular method) und keiner hat funktioniert. Ich kann nichts anderes online finden, das mir eine Idee gibt, wie man es schafft. Kann jemand einen Weg vorschlagen? Hier ist eine Art, wie ich es versucht habe. Dies öffnet die Aktivität, scrollt jedoch nicht.

Ich wäre dankbar für jede Hilfe.

MainActivity:

public class MainActivity extends AppCompatActivity { 


Button buttonHeader3a, buttonHeader3b, buttonHeader3c, buttonHeader3d; 
ScrollView myView; 

TextView myTV; 
TextView hdr3a, hdr3b, hdr3c, hdr3d; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 

@Override 
     public void onClick(View v) { 
     Intent i = new Intent(MainActivity.this, SearchActivity.class); 
     startActivity(i); 
     } 
    }); 


    buttonHeader3a = (Button) findViewById(R.id.b1); 
    buttonHeader3b = (Button) findViewById(R.id.b2); 
    buttonHeader3c = (Button) findViewById(R.id.b3); 
    buttonHeader3d = (Button) findViewById(R.id.b4); 

    myView = (ScrollView) findViewById(R.id.myview); 
    myTV = (TextView) findViewById(R.id.ch3p16); 

    hdr3a = (TextView) findViewById(R.id.header3a); //hdr = header 
    hdr3b = (TextView) findViewById(R.id.header3b); 
    hdr3c = (TextView) findViewById(R.id.header3c); 
    hdr3d = (TextView) findViewById(R.id.header3d); 


    buttonHeader3a.setOnClickListener(new Button.OnClickListener() { 


     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3a.getTop()); 
       } 
      }); 
     } 
    }); 

    buttonHeader3b.setOnClickListener(new Button.OnClickListener() { 

     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3b.getTop()); 
       } 
      }); 
     } 
    }); 

    buttonHeader3c.setOnClickListener(new Button.OnClickListener() { 

     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3c.getTop()); 
       } 
      }); 
     } 
    }); 


    buttonHeader3d.setOnClickListener(new Button.OnClickListener() { 


     public final void onClick(View view) { 
      new Handler().post(new Runnable() { 
       @Override 
       public void run() { 
        myView.smoothScrollTo(0, hdr3d.getTop()); 
       } 
      }); 
     } 
    }); 
} 

    public void onButtonLinkPrealerting (View v) { 
     if (v.getId() == R.id.buttonLinkPrealerting) { 
      Intent i = new Intent(MainActivity.this, Chapter4.class); 
      startActivity(i); 
     } 
    } 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


// Here's where i'm trying to pick up an intent in SearchActivity and scroll down 


@Override 
protected void onNewIntent (Intent intent) { 
    super.onNewIntent (intent); 
    if(intent.getStringExtra("methodName").equals("myMethod")) { 
     myView.post(new Runnable() { 
      @Override 
      public void run() { 
       myView.smoothScrollTo(0, hdr3a.getTop()); 
      } 
     }); 
    } 
} 

// similar methods to scroll to other sections... 

}

SearchActivity:

public class SearchActivity extends Activity { 


// List view 
private ListView lv; 

// Listview Adapter 
ArrayAdapter<String> adapter; 

// Search EditText 
EditText inputSearch; 


// ArrayList for Listview 
ArrayList<HashMap<String, String>> productList; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_search); 


    // Listview Data 
    String products[] = { 
      "first very long string", 
      "second very long string", 
    // Several other very long strings 
      }; 

    lv = (ListView) findViewById(R.id.list_view); 
    inputSearch = (EditText) findViewById(R.id.inputSearch); 

    // Adding items to listview 
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.product_name, products); 
    lv.setAdapter(adapter); 

    /** 
    * Enabling Search Filter 
    * */ 
    inputSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      SearchActivity.this.adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 
      // TODO Auto-generated method stub 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
      // TODO Auto-generated method stub 
     } 
    }); 


    lv.setOnItemClickListener(
     new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
    String a = parent.getAdapter().getItem(position).toString(); 


    if (a.equals"first very long string")) 
     { 
     Intent intent = new Intent(); 
     intent.setClass (getBaseContext(), MainActivity.class); 
     intent.putExtra("methodName", "myMethod"); 
     startActivity(intent); 
           } 

     else 

     if (a.equals"second very long string")) 

// more of the same 

      } 
      }); 
      } 
      } 


Antwort

2

Wenn ich Sie wäre, würde ich die Logik Ihrerbewegen(in MainActivity) in die onCreate statt.

Gemäß der Dokumentation,

Griff onNewIntent(), um das Fragment Manager zu informieren, dass der Zustand nicht gespeichert. Wenn Sie neue Absichten bearbeiten und möglicherweise Änderungen am Fragmentstatus vornehmen, möchten Sie sicher sein, zuerst bis zur Superklasse aufzurufen. Andernfalls, wenn Ihr Zustand gespeichert ist, aber die Aktivität nicht gestoppt wird, könnten Sie einen onNewIntent() -Aufruf , der vor onResume() passiert und versuchen, Fragmentoperationen an diesem Punkt zu führen werfen IllegalStateException , weil der Fragmentmanager denkt Zustand ist noch gespeichert.

daher einfach überprüfen, ob Sie Daten übergeben zu Ihrer Tätigkeit haben onCreate beim Erstellen:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //All your other initialisations 

    //Get any potential intent that was passed to the activity 
    Intent intent = getIntent(); 
    if (intent != null) { 
     //Is there a string extra in that intent? 
     String extra = intent.getStringExtra("methodName"); 
     //Is that string not empty and equals what you're looking for? 
     if (!TextUtils.isEmpty(extra) && extra.equals("myMethod")) { 
     myView.post(new Runnable() { 
      @Override 
      public void run() { 
       myView.smoothScrollTo(0, hdr3a.getTop()); 
      } 
     }); 
     } 
    } 
} 
+1

Es funktioniert perfekt. Vielen Dank. –

Verwandte Themen