2015-09-22 2 views
1

Я новичок в android и пытаюсь создать активность, в которой есть фрагмент. Идея состоит в том, что у фрагмента есть 3 ImageButtons. Образ ImageButton, который вы нажмете, переместит его образ в действие, а затем отобразит его в другом фрагменте, созданном после onClick (полноэкранный ImageView) в рамках основного действия. Проблема в том, что я не могу понять, как передавать информацию. Я прочитал несколько заданных вопросов, которые уже были заданы, и перешел на сайт разработчиков Android, но чем больше я читаю, тем более запутанным становится. Я также сталкиваюсь с проблемой findViewById, говоря, что он не может решить этот метод. Я понятия не имею, почему это говорит мне об этом, и многое попробовало исправить, ничего не работает. Вот мой код, и любые предложения будут оценены.Pass ImageButton Value

Основная деятельность:

import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 

public class MainActivity extends AppCompatActivity implements MainActivityFragment.CanPassData{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 


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

     return super.onOptionsItemSelected(item); 
    } 
    public void passData(int value){ 
     MainActivityFragment fragment = new MainActivityFragment(); 
     fragment.setData(5); 
     getSupportFragmentManager().beginTransaction().add(R.id.fragment, fragment).commit(); 
     //***Taken From Android Developer, I believe this is how you create a new fragment when you pass the data to the main activity**** 
     if (fragment != null) { 
      fragment.getData(); 
     } else { 
      MainActivityFragment newFragment = new MainActivityFragment(); 
      Bundle args = new Bundle(); 
      //******No idea what this is calling, pictureChosen and picture are default values taken from the website******* 
      args.putInt(MainActivityFragment.pictureChosen, picture); 
      newFragment.setArguments(args); 

      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 


      transaction.replace(R.id.fragment, newFragment); 
      transaction.addToBackStack(null); 
      transaction.commit(); 
     } 
     //***************************************************************************************** 
    } 
    public void processData(){ 
     MainActivityFragment fragment = (MainActivityFragment) getSupportFragmentManager().findFragmentById(R.id.fragment); 
     int value = fragment.getData(); 
    } 
} 

Фрагмент:

import android.content.Intent; 
import android.graphics.drawable.Drawable; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageButton; 
import android.widget.ImageView; 

public class MainActivityFragment extends Fragment implements View.OnClickListener { 

    private int data; 
    private CanPassData parent; 

    public interface CanPassData{ 
     public void passData(int value); 
    } 

    public MainActivityFragment() { 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     //***findViewById is saying it cannot resolve below 
     setContentView(R.layout.fragment_main); 
     ImageButton button1 = (ImageButton) findViewById(R.id.imageButton); 
     ImageButton button2 = (ImageButton) findViewById(R.id.imageButton2); 
     ImageButton button3 = (ImageButton) findViewById(R.id.imageButton3); 

     button1.setOnClickListener(this); 
     button2.setOnClickListener(this); 
     button3.setOnClickListener(this); 
     //****************************************************************************************** 
     return inflater.inflate(R.layout.fragment_main, container, false); 
    } 

    public void onAttach(MainActivity activity){ 
     parent = (CanPassData) activity; 
    } 

    public void setData(int value){ 
     data = value; 
    } 
    //***onClick also has all findViewByID as cannot resolve method, and i'm not exactly sure what to do within each case, the stuff I have in there was also taken from android developer. 
    @Override 
    public void onClick(View v){ 
     switch (v.getId()) { 
      case R.id.imageButton: 
       ImageView box = (ImageView)findViewByID(R.id.imageButton); 
       Drawable name = box.getBackground().getCurrent(); 
       Intent intent = new Intent (this, newFragment.class); 
       intent.putExtra("com.example.coding.assignment2", name); 
       startActivity(intent); 
       break; 
      case R.id.imageButton2: 
       box = (ImageView)findViewByID(R.id.imageButton2); 
       name = box.getBackground().getCurrent(); 
       intent = new Intent (this, newFragment.class); 
       intent.putExtra("com.example.coding.assignment2", name); 
       startActivity(intent); 
       break; 
      case R.id.imageButton3: 
       box = (ImageView)findViewByID(R.id.imageButton3); 
       name = box.getBackground().getCurrent(); 
       intent = new Intent (this, newFragment.class); 
       intent.putExtra("com.example.coding.assignment2", name); 
       startActivity(intent); 
       break; 
     } 
    } 

    public void pushData(){ 
     parent.passData(data); 
    } 

    public int getData(){ 
     return data; 
    } 
} 

Многие из таких методов, как GetData и pushData Я точно не знаю, как использовать, чтобы получить информацию по основной деятельности , это была информация, предоставленная мне во время занятий. Я задаюсь вопросом, есть ли способ просто передать самозагружаемый сам, если он щелкнут, а затем назначьте его для ImageView в новом фрагменте, который отобразит его, охватывающий весь фрагмент. Мне сказали, что мне нужно сделать 2-й фрагмент xml, но сам файл java должен быть создан с помощью основного действия. Это верно?

+0

лол. Это может сбивать с толку, поскольку есть несколько способов сделать это, чтобы что делать? Поскольку вы намерены перейти от фрагмента -> активность -> фрагмент, вы можете просто создать новый файл класса с именем (например) Globals, где вы определяете статическую растяжку или что угодно. Событие OnClick помещает изображение в статический глобальный drawable и bam! вы можете использовать его в любом месте без необходимости писать строки кода повсюду. Как его статический, вы захотите убедиться в утечке памяти и использовании, но ее повторное использование, хотя и повторное использование. – CmosBattery

ответ

0

Вы не можете разрешить findViewById, потому что вы должны надуть View для того, чтобы использовать фрагменты findViewById, как это:

View v = inflater.inflate(R.layout.fragment_main, parent, false); 
ImageButton button1 = (ImageButton) v.findViewById(R.id.imageButton); 
ImageButton button2 = (ImageButton) v.findViewById(R.id.imageButton2); 
ImageButton button3 = (ImageButton) v.findViewById(R.id.imageButton3); 

//call your button.setOnClickListener 
return v; 

Там нет необходимости вызывать setContentView()

В onClick(View v) также необходимо для звонка v.findViewById()

Также вы уменьшаете свои переменные в случае, вы должны объявить их перед любым случаем, если вы хотят использовать их таким образом. Это должно выглядеть примерно так:

public void onClick(View v){ 
    ImageView box=null; 
    Drawable name = null; 
    Intent intent = null; 
    switch(v.getId()){ 
     case R.id.imageButton: 
      box = (ImageView) v.findViewByID(R.id.imageButton); 
      name = box.getBackground().getCurrent(); 
      intent = new Intent (this, newFragment.class); 
      intent.putExtra("com.example.coding.assignment2", name); 
      startActivity(intent); 
      break; 

И так далее